#include "FabricaParticipantes.h"

#include "Pacman.h"
#include "PersonajePacman.h"
#include "TexturasPacman.h"

#include "Fantasma.h"

#include "EstrategiaMovimiento.h"
#include "EstrategiaMovimientoPacman.h"
#include "EstrategiaMovimientoFantasma.h"
#include "EstrategiaMovimientoPersegir.h"
#include "EstrategiaMovimientoHuir.h"
#include "EstrategiaMovimientoEstarEnCueva.h"

#include "Punto.h"
#include "constantes.h"
#include <sstream>



int FabricaParticipantes::velocidadStandardFantasma = VELOCIDAD_FANTASMA ;
int FabricaParticipantes::velocidadStandardPacman = VELOCIDAD_PACMAN ;

// Para simplificar el seteo de las texturas de los fantasmas.
TexturasFantasma* FabricaParticipantes::inicializarTexturasFantasma(string pacman, string fantasma){
	std::stringstream ss;
	ss << "img/fantasmas/dePacman" << pacman << "/F" << fantasma ;
	string* st ;
	TexturasFantasma* tpersonaje;
	st = new string(ss.str() + "_Abajo_mov1.bmp") ;
	tpersonaje = new TexturasFantasma(st->c_str(),"#000000");
	delete st;
	st = new string(ss.str() + "_Abajo_mov2.bmp") ;
	tpersonaje->addTexturaAbajo(st->c_str(),"#000000");
	delete st;
	st = new string(ss.str() + "_Arriba_mov1.bmp") ;
	tpersonaje->addTexturaArriba(st->c_str(),"#000000",true);
	delete st;
	st = new string(ss.str() + "_Arriba_mov2.bmp") ;
	tpersonaje->addTexturaArriba(st->c_str(),"#000000");
	delete st;
	st = new string(ss.str() + "_Izq_mov1.bmp") ;
	tpersonaje->addTexturaIzquierda(st->c_str(),"#000000",true);
	delete st;
	st = new string(ss.str() + "_Izq_mov2.bmp") ;
	tpersonaje->addTexturaIzquierda(st->c_str(),"#000000");
	delete st;
	st = new string(ss.str() + "_Der_mov1.bmp") ;
	tpersonaje->addTexturaDerecha(st->c_str(),"#000000",true);
	delete st;
	st = new string(ss.str() + "_Der_mov2.bmp") ;
	tpersonaje->addTexturaDerecha(st->c_str(),"#000000");
	delete st;

	std::stringstream dd ;
	dd << "img/fantasmas/dePacman" << pacman << "/transformado_mov" ;
	tpersonaje->addTexturaPerseguido( dd.str() + "1.bmp","#000000");
	tpersonaje->addTexturaPerseguido( dd.str() + "2.bmp","#000000");


	std::stringstream dd2 ;
	dd2 << "img/fantasmas/dePacman" << pacman << "/ojitos_vuelvenAcueva_" ;
	tpersonaje->addTexturaMuerto( dd2.str() + "1.bmp","#000000");
	tpersonaje->addTexturaMuerto( dd2.str() + "2.bmp","#000000");
	
	std::stringstream dd3 ;
	dd3 << "img/fantasmas/dePacman" << pacman << "/sigueotro_mov" ;
	tpersonaje->addTexturaSigueOtro( dd3.str() + "1.bmp","#000000");
	tpersonaje->addTexturaSigueOtro( dd3.str() + "2.bmp","#000000");

	return tpersonaje ;

}

// Simplifica la creacion de un Jugador
Jugador* FabricaParticipantes::crearJugador(const string& nombre, int x, int y ,const string& text1, const string& text2,const string& alpha , Comando* comando){

	int radio = EscenarioModelo::getEscenario()->getRadioStandard();

	Punto* puntoInicialPacman1 = EscenarioModelo::getEscenario()->getSendero()->getPuntoSenderoConPuntoGrilla(x,y);
	
	EstrategiaMovimiento* em1 = new EstrategiaMovimientoPacman(velocidadStandardPacman);
    
    // Se crea un Jugador del Modelo para que lleve los puntos en su marcador.

	Pacman* objetoPacman1 = new Pacman(em1,puntoInicialPacman1,radio,true,new JugadorModelo(nombre));

	TexturasPacman* tpacman = new TexturasPacman(text1,alpha);
	tpacman->addTextura(text2,alpha);
	
	PersonajePacman *pacman1 = new PersonajePacman(tpacman,objetoPacman1,nombre);

	Jugador *jugador1 = new Jugador(nombre,nombre,pacman1,comando);

	return jugador1;
}


// Simplifica la creacion de la lista de fantasmas que corresponden a un jugador
Lista<PersonajeFantasma>* FabricaParticipantes::crearFantasmas(Jugador* jug, const string& nro, const int* coorPos){
	int cantFantasmas;
	stringstream msg;

	PersonajeFantasma *F1_1, *F2_1, *F3_1, *F4_1;

	Lista<PersonajeFantasma>* lista = new Lista<PersonajeFantasma>;	
	Pacman* objetoPacman = (Pacman*)(jug->getPersonaje()->getObjeto());

	//int cantFantasmas = 0 ;
	string* strCantFantasmas = TagHandler::getInstance()->getPropiedad(CANTIDAD_FANTASMAS_POR_PACMAN);
	if( strCantFantasmas && (cantFantasmas = Utils::toInt(*strCantFantasmas)) > -1 ){
		msg << "cantidad de fantasmas recibida: ";
		msg << cantFantasmas;
		Logger::getInstance()->info(msg.str());
	}
	else{
		cantFantasmas = DEFAULT_CANTIDAD_FANTASMAS_POR_PACMAN;
		msg << "cantidad de fantasmas no recibida (asumiendo valor default): ";
		msg << DEFAULT_CANTIDAD_FANTASMAS_POR_PACMAN;
		Logger::getInstance()->info(msg.str());
	}
	delete strCantFantasmas;
	
	int radio = EscenarioModelo::getEscenario()->getRadioStandard();

	// PRIMER FANTASMA
	if(cantFantasmas > 0 ){
		cantFantasmas-- ;
		Punto* puntoInicialF1_1 = EscenarioModelo::getEscenario()->getSendero()->getPuntoSenderoConPuntoGrilla(coorPos[0],coorPos[1]);
		TexturasFantasma* tpersonajeF1_1 = inicializarTexturasFantasma(nro,"1");
		EstrategiaMovimientoFantasma* eF1_1 = new EstrategiaMovimientoEstarEnCueva(objetoPacman, velocidadStandardFantasma); 
		Fantasma* objetoF1_1 = new Fantasma(eF1_1,puntoInicialF1_1,radio,true,objetoPacman);
		F1_1 = new PersonajeFantasma(tpersonajeF1_1,objetoF1_1,"FANTASMA1_"+nro);
		lista->agregar(F1_1);
	}

	// SEGUNDO FANTASMA
	if(cantFantasmas > 0 ){
		cantFantasmas-- ;
		Punto* puntoInicialF2_1 = EscenarioModelo::getEscenario()->getSendero()->getPuntoSenderoConPuntoGrilla(coorPos[2],coorPos[3]);
		TexturasFantasma* tpersonajeF2_1 = inicializarTexturasFantasma(nro,"2");
		EstrategiaMovimientoFantasma* eF2_1 = new EstrategiaMovimientoEstarEnCueva(objetoPacman, velocidadStandardFantasma);
		Fantasma* objetoF2_1 = new Fantasma(eF2_1,puntoInicialF2_1,radio,true,objetoPacman);
		F2_1 = new PersonajeFantasma(tpersonajeF2_1,objetoF2_1,"FANTASMA2_"+nro);
		lista->agregar(F2_1);
	}

	// TERCER FANTASMA
	if(cantFantasmas > 0 ){
		cantFantasmas-- ;
		Punto* puntoInicialF3_1 = EscenarioModelo::getEscenario()->getSendero()->getPuntoSenderoConPuntoGrilla(coorPos[4],coorPos[5]);
		TexturasFantasma* tpersonajeF3_1 = inicializarTexturasFantasma(nro,"3");
		EstrategiaMovimientoFantasma* eF3_1 = new EstrategiaMovimientoPersegir(objetoPacman, velocidadStandardFantasma);
		Fantasma* objetoF3_1 = new Fantasma(eF3_1,puntoInicialF3_1,radio,true,objetoPacman);
		F3_1 = new PersonajeFantasma(tpersonajeF3_1,objetoF3_1,"FANTASMA3_"+nro);
		lista->agregar(F3_1);
	}

	// CUARTO FANTASMA
	if(cantFantasmas > 0 ){
		cantFantasmas-- ;
		Punto* puntoInicialF4_1 = EscenarioModelo::getEscenario()->getSendero()->getPuntoSenderoConPuntoGrilla(coorPos[6],coorPos[7]);
		TexturasFantasma* tpersonajeF4_1 = inicializarTexturasFantasma(nro,"4");
		EstrategiaMovimientoFantasma* eF4_1 = new EstrategiaMovimientoPersegir(objetoPacman, velocidadStandardFantasma);
		Fantasma* objetoF4_1 = new Fantasma(eF4_1,puntoInicialF4_1,radio,true,objetoPacman);	
		F4_1 = new PersonajeFantasma(tpersonajeF4_1,objetoF4_1,"FANTASMA4_"+nro);
		lista->agregar(F4_1);
	}
		  
	return lista;
}